import pygame  # 导入游戏模块，需要安装
import random  # 导入随机数模块

from pygame.locals import *  # 导入常用属性及事件，比如按键
from sys import exit  # 系统模块的退出事件

# 初始化pygame，为使用硬件做准备
pygame.init()

# 创建一个窗口，分辨率(640, 480)
screen = pygame.display.set_mode((640, 480), 0, 32)
# 游戏的时间控制
clock = pygame.time.Clock()

# 设置窗口标题及文字字体
pygame.display.set_caption('hello 毛毛虫(F2 抛撒食物)!')
ft = pygame.font.SysFont('stsong', 40)  # 设置字体,宋体,字体名字很难找，通过pygame.font.get_fonts()打印出来找的
# ft = pygame.font.SysFont('simHei', 40) # 设置字体,黑体
# ft = pygame.font.Font(r'C:\Windows\Fonts\simsun.ttc', 40) # 根据字体文件设置文字字体，宋体

# 用到的颜色
bg_sky = (135, 206, 235)  # 天空颜色
bg_grand = (102, 205, 0)  # 草地颜色
mmc_h = (255, 99, 71)  # 毛毛虫头
mmc_b = (240, 128, 128)  # 毛毛虫身
mmc_t = (240, 128, 128)  # 毛毛虫尾
food_c = (240, 240, 0)  # 食物颜色
bang_c = (139, 123, 139)  # 土障颜色
sun_c = (255, 64, 64)  # 太阳颜色
txt_c = (200, 20, 20)  # 文字颜色

# 绘制毛毛虫,简单了，就画几个圆圈
mmc = [[32, 28], [33, 28], [34, 28], [35, 28], [36, 28]]  # 初始毛毛虫的坐标


def draw_mmc():
    # 画身体
    for x, y in mmc[1:len(mmc) - 1]:
        pygame.draw.circle(screen, mmc_b, (x * 10, y * 10), 5, 0)
    # 画尾部
    x, y = mmc[len(mmc) - 1]
    pygame.draw.circle(screen, mmc_t, (x * 10, y * 10), 3, 0)
    # 画头，最后画，免得回头时身体遮住了
    x, y = mmc[0]
    pygame.draw.circle(screen, mmc_h, (x * 10, y * 10), 6, 0)


# 绘制食物
food = []


def put_food():
    for i in range(10):
        x = random.randint(1, 63)
        y = random.randint(30, 47)
        pos = [x, y]
        if pos not in food + mmc + bang:
            food.append(pos)


def draw_food():
    for x, y in food:
        pygame.draw.circle(screen, food_c, (x * 10, y * 10), 3, 0)


# 绘制障碍物
bang = []


def put_bang():
    for i in range(500):
        x = random.randint(1, 63)
        y = random.randint(30, 47)
        pos = [x, y]
        if pos not in food + mmc + bang:
            bang.append(pos)


def draw_bang():
    for x, y in bang:
        pygame.draw.rect(screen, bang_c, [x * 10 - 5, y * 10 - 5, 10, 10], 0)

# 按键控制


def k_down(k):
    tmp = mmc[0].copy()
    if k[K_UP]:
        if mmc[0][1] == 1:
            return
        mmc[0][1] -= 1  # 头向上一格
    elif k[K_DOWN]:
        if mmc[0][1] == 47:
            return
        mmc[0][1] += 1  # 头向下一格
    elif k[K_LEFT]:
        if mmc[0][0] == 1:
            return
        mmc[0][0] -= 1  # 头向左一格
    elif k[K_RIGHT]:
        if mmc[0][0] == 63:
            return
        mmc[0][0] += 1  # 头向右一格
    elif k[K_F2]:
        put_food()  # 撒食物
        return
    else:
        return

    # 身体跟随
    for i in range(1, len(mmc)):
        tmp2 = mmc[i].copy()
        mmc[i] = tmp
        tmp = tmp2
        if mmc[0] in food:
            food.remove(mmc[0])  # 吃到食物，消除食物，身体增长
            mmc.append(tmp)


# 游戏主循环
Goon = True
put_food()  # 生成食物坐标
put_bang()  # 生成土墙坐标
while Goon:
    # 把这个游戏调成多少帧,想跑的快就搞大点
    clock.tick(10)

    # 处理消息事件
    for event in pygame.event.get():
        if event.type == QUIT:  # 窗口右上角叉叉
            # 接收到退出
            Goon = False
    # 检查按键
    keys_pressed = pygame.key.get_pressed()  # 这个返回键盘列表，按了的键就是True
    k_down(keys_pressed)  # 处理按键

    # 填充背景
    screen.fill(bg_sky, (0, 0, 640, 280))  # 蓝天
    pygame.draw.circle(screen, sun_c, (100, 120), 10, 0)  # 太阳
    screen.fill(bg_grand, (0, 280, 640, 480))  # 草地

    # 绘制食物
    draw_food()

    # 绘制土墙
    draw_bang()

    # 绘制毛毛虫
    draw_mmc()

    st_msg = 'go,go,go,加油干!'
    # 吃完了
    if len(food) == 0:
        st_msg = '吃光了,你好棒，F2加餐!'
    # 撞墙了
    if mmc[0] in bang:
        st_msg = '吃到土了,再接再厉!'

    sf = ft.render(st_msg, 1, txt_c)  # 根据字体加颜色构建显示内容位块
    screen.blit(sf, (140, 30))  # 把显示位块传送到显存里

    # 刷新画面，两个方法都可以
    # pygame.display.update()
    pygame.display.flip()  # 把显存刷新到屏幕

pygame.quit()  # 游戏结束,释放pygame,关闭窗口
# ————————————————

# 版权声明：本文为博主原创文章，遵循 CC 4.0 BY - SA 版权协议，转载请附上原文出处链接和本声明。

# 原文链接：https: // blog.csdn.net / xinjian99 / article / details / 107962229
